require "BuildingObjects/ISBuildingObject"

--***********************************************************
--**                    ROBERT JOHNSON                     **
--** Help you to place your tent by let you dragging a ghost render of the tent around **
--***********************************************************

campingTent = ISBuildingObject:derive("campingTent");

--************************************************************************--
--** campingTent:new
--**
--************************************************************************--
function campingTent:create(x, y, z, north, sprite)
	local sq = getWorld():getCell():getGridSquare(x, y, z);
	ISTimedActionQueue.add(ISAddTentAction:new(self.character, sq, self.character:getInventory():FindAndReturn("CampingTentKit"), sprite, 0));
end

function campingTent:walkTo(x, y, z)
	local playerObj = getSpecificPlayer(self.player)
	local square = getCell():getGridSquare(x, y, z)
	local square2 = self:getSquare2(square, self.north)
	if square:DistToProper(playerObj) < square2:DistToProper(playerObj) then
		return luautils.walkAdj(playerObj, square)
	end
	return luautils.walkAdj(playerObj, square2)
end

function campingTent:onTimedActionStart(action)
	ISBuildingObject.onTimedActionStart(self, action)
	self.character:SetVariable("LootPosition", "Mid")
	action:setOverrideHandModels(nil, nil)
	-- ISBuildAction is running, ISAddTentAction completes instantly
	action.character:faceLocation(action.square:getX(), action.square:getY())
end

function campingTent:new(character, tentSprites)
	local o = {}
	setmetatable(o, self)
	self.__index = self
	o:init()
	o:setNorthSprite(tentSprites.frontLeft);
	o:setSprite(tentSprites.frontRight);
	o.tentSprites = tentSprites
    o.character = character;
    o.noNeedHammer = true;
    o.actionAnim = "Loot"
--~ 	o:setDragNilAfterPlace(true);
	return o;
end

function campingTent:isValid(square)
	local valid = self:isSquareFree(square)
	if valid and not self.character:getInventory():contains("CampingTentKit") then
		valid = false
	end
	local square2 = self:getSquare2(square, self.north)
	if valid and not (square2 and self:isSquareFree(square2) and not square:isSomethingTo(square2)) then
		valid = false
	end
--~ 	local result = false;
--~ 	for i = 0, square:getObjects():size() - 1 do
--~ 		local item = square:getObjects():get(i);
--~ 		if luautils.stringStarts(item:getTextureName(), "floors_exterior")  or luautils.stringStarts(item:getTextureName(), "blends_natural")then
--~ 			result = true;
--~ 			break;
--~ 		end
--~ 	end
--~ 	if result then
--~ 		result = square:getSpecialObjects():size() == 0;
--~ 	end
	return valid
end

function campingTent:render(x, y, z, square)
	-- render the first part
	ISBuildingObject.render(self, x, y, z, square)

	-- name of our 2nd tent sprite
	local sprite2Name = self.tentSprites.backLeft;
	if not self.north then
		sprite2Name = self.tentSprites.backRight;
	end

	-- render the 2nd part of the tent
	local sprite2 = IsoSprite.new();
	sprite2:LoadFramesNoDirPageSimple(sprite2Name);
	x, y, z = self:getSquare2Pos(square, self.north)
	if self:isValid(square) then
		sprite2:RenderGhostTile(x, y, z);
	else
		sprite2:RenderGhostTileRed(x, y, z);
	end
end

function campingTent:isSquareFree(square)
	if not square then return false end
	if square:getMovingObjects():size() > 0 then return false end
	if square:getStaticMovingObjects():size() > 0 then return false end
	if square:isVehicleIntersecting() then return false end
	for i=0,square:getObjects():size()-1 do
		local object = square:getObjects():get(i)
		if object:getSprite() and not object:getSprite():getProperties():Is(IsoFlagType.solidfloor) then
            if object:getType() == IsoObjectType.tree or object:getType() == IsoObjectType.wall then
                return false;
            end
		    return not square:isSolidTrans();
		end
	end
	return true
end

function campingTent:getSquare2Pos(square, north)
	local x = square:getX()
	local y = square:getY()
	local z = square:getZ()
	if north then
		x = x - 1
	else
		y = y - 1
	end
	return x, y, z
end

function campingTent:getSquare2(square, north)
	local x, y, z = self:getSquare2Pos(square, north)
	return getCell():getGridSquare(x, y, z)
end

